package com.njtech.pet.dao.example;

import com.njtech.pet.constant.Constant;
import com.njtech.pet.dao.StaticDao;
import com.njtech.pet.entity.SingleRecord;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Calendar;
import java.util.List;

/**
 * @author lxj
 * Date 2020-04-02 15:24
 * Description 统计DAO的使用例子
 */
public class StaticDaoExample {
    StaticDao staticDao;
    @Before
    public void prepare() {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
        staticDao = (StaticDao) context.getBean("staticDao");
    }

    @Test
    public void getUserNumInDays() {
        //获取七天内的普通用户数量
        System.out.println("7天内普通用户的数量: " + staticDao.getUserNumInDays(7, false, Constant.User.STATE_VALID.getValue()));
        //获取三十天内的注册会员数量
        System.out.println("30天内会员的数量: " + staticDao.getUserNumInDays(30, true, Constant.User.STATE_VALID.getValue()));
        //获取所有的注册会员数量
        System.out.println("所有会员的数量: " + staticDao.getUserNumInDays(null, true, Constant.User.STATE_VALID.getValue()));
    }

    @Test
    public void getActiveUserNumInDays() {
        //7天内活跃用户的数量
        //活跃用户:这几天内有行为记录的用户，只要浏览过、收藏过、签到过都算
        System.out.println("7天内活跃用户的数量:" + staticDao.getActiveUserNumInDays(7,true));
    }

    @Test
    public void getActionCountInDate() {
        //获取过去7天，每一天的浏览行为的数量(最小单位为天)
        //日浏览商品人数
        List<SingleRecord> viewRecords = staticDao.getActionCountInDate(7, "%Y-%m-%d", Constant.Action.ACTION_VIEW.getValue(), Constant.Action.STATE_VALID.getValue());
        System.out.println("日浏览商品人数:");
        for (SingleRecord record : viewRecords) {
            System.out.println(record);
        }
        //获取过去12个月，每一个月的分享商品的数量(最小单位为月)
        //月分享商品人数
        List<SingleRecord> shareRecords = staticDao.getActionCountInDate(
                /*12个月*/12,
                "%Y-%m",
                Constant.Action.ACTION_SHARE.getValue(),
                Constant.Action.STATE_VALID.getValue());
        System.out.println("日分享商品人数:");
        for (SingleRecord record : shareRecords) {
            System.out.println(record);
        }
        //获取本月每天___数量的思路
        Calendar c = Calendar.getInstance();
        int days = c.get(Calendar.DAY_OF_MONTH);
        System.out.println("今天是本月第" + days + "天");
        viewRecords = staticDao.getActionCountInDate(days, "%Y-%m-%d", Constant.Action.ACTION_VIEW.getValue(), Constant.Action.STATE_VALID.getValue());
        System.out.println("本月日浏览商品人数:");
        for (SingleRecord record : viewRecords) {
            System.out.println(record);
        }
        /*
        由于支付行为、使用行为、退货行为等不再添加到Action表内，
        所以获得此种行为的个数，如支付订单数，要使用另外一个方法
        getBillNumInDaysByTypeAndState或
        getBillCountInDate
        */
    }
    /****************注意**********************
    * 接下来Item和Bill根据日期获取的规则：
    * Item是用createDate作为比较日期，以商品上线日期为准，
    * Bill是用updateDate作为比较日期，因为支付、撤销等操作会更新修改日期
    * ******************************************/

    @Test
    public void getItemNumInDaysByTypeAndStateAndSubject() {
        //获取10天内新增的小狗保险的总数量
        System.out.println("10天内新增的小狗保险的总数量: " + staticDao.getItemNumInDaysByTypeAndStateAndSubject(30, Constant.Item.TYPE_COUPON.getValue(), Constant.Item.STATE_VALID.getValue(), null));
        //由于小狗不再常量类里，所以先这样用着...到时候要替换成常量
    }

    @Test
    public void getBillNumInDaysByTypeAndState() {
        //获取10天内新支付的保险的总数量
        System.out.println("10天内新支付的保险的总数量: " + staticDao.getBillNumInDaysByTypeAndState(10, Constant.Bill.TYPE_INSURANCE.getValue(), Constant.Bill.STATE_BILL_PAID.getValue()));
    }

    @Test
    public void getItemCountInDate(){
        //过去12个月每月新增商品数量
        List<SingleRecord> records = staticDao.getItemCountInDate(12, Constant.Item.TYPE_INSURANCE.getValue(), Constant.Item.STATE_VALID.getValue(), "%Y-%m", null);
        for (SingleRecord record :
                records) {
            System.out.println(record);
        }
    }

    @Test
    public void getBillCountInDate() {
        //过去12个月每月的新增成功支付订单个数
        List<SingleRecord> records = staticDao.getBillCountInDate(12, Constant.Bill.TYPE_TOPUPMEMBER.getValue(), Constant.Bill.STATE_PERMANENT.getValue(), "%Y-%m");
        for (SingleRecord record :
                records) {
            System.out.println(record);

        }
    }
}
